Himmelblau 関数
$ f(x,y) = (x^2 + y - 11)^2 + (x+y^2 - 7)^2
$ (x, y) = (3.0, 2.0), (-2.805118, 3.131312), (-3.779310, -3.283186), (3.584428, -1.848126)のとき$ f(x,y) = 0
$ -5 \leq x, y \leq 5
code:himmelblau.py
import torch as pt
import matplotlib.pyplot as plt
def himmelblau(x, y):
return (x**2 + y - 11)**2 + (x + y**2 - 7)**2
x = pt.linspace(-5, 5, 100)
y = pt.linspace(-5, 5, 100)
xx, yy = pt.meshgrid(x, y, indexing='xy')
zz = himmelblau(xx, yy)
levels = 50
plt.contour(xx, yy, zz, levels=levels)
# plt.pcolormesh(xx, yy, zz)
plt.colorbar()
plt.show()
https://scrapbox.io/files/687742d162a10c9faeddd501.png
引数を1つのベクトルにして関数化
code:p.py
import torch as pt
import matplotlib.pyplot as plt
def himmelblau(x): # 引数1個
x, y = x
return (x**2 + y - 11)**2 + (x + y**2 - 7)**2
def plot_himmelblau():
x = pt.linspace(-5, 5, 100)
y = pt.linspace(-5, 5, 100)
xx, yy = pt.meshgrid(x, y, indexing='xy')
zz = himmelblau((xx, yy)) # タプルで与えることに注意
levels = 30
plt.contour(xx, yy, zz, levels=levels)
# plt.pcolormesh(xx, yy, zz)
plt.colorbar()
plot_himmelblau()
plt.show()
himmelblau(x, y) とすると戻り値の勾配が分割され、その後の統合処理が面倒なので himmelblau(x) としている。